package oo.day09;

//多态顺序：this.show(o) > super.show(o) > this.show((super)o) > super.show((super)o)

public class DuoTaiTest {

    public static void main(String[] args) {
        A a = new B();
        System.out.println( "A a = new B()--->a.show(a)---->"+a.show(a));//子类重写了父类的方法

        A a1 =new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println(a1.show(b));
        System.out.println(a1.show(c));
        System.out.println(a1.show(d));//这三个在A类分别传入的参数不同，调用不同的方法


//      a2.show(b)  a2是一个引用变量，类型为A，则this为a2，b是B的一个实例，于是它到类A里面找show(B obj)方法，没有找到，于是到A的super(超类)找，
//        而A没有超类，因此转到第三优先级this.show((super)O)，this仍然是a2，这里O为B，(super)O即(super)B即A，因此它到类A里面找show(A obj)的方法，
//        类A有这个方法，但是由于a2引用的是类B的一个对象，B覆盖了A的show(A obj)方法，因此最终锁定到类B的show(A obj)，输出为"B and A”。
        System.out.println(a2.show(b));
        System.out.println(a2.show(c));
        System.out.println(a2.show(d));

        System.out.println(b.show(b));
        System.out.println(b.show(c));
        System.out.println(b.show(d));

    }
}
